# Copyright (c) 2006-2007 The Regents of The University of Michigan
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met: redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer;
# redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution;
# neither the name of the copyright holders nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

from os import environ as env

from common.SysPaths import (
    binary,
    disk,
    script,
)

from m5.defines import buildEnv


class SysConfig:
    def __init__(
        self, script=None, mem=None, disks=None, rootdev=None, os_type="linux"
    ):
        self.scriptname = script
        self.disknames = disks
        self.memsize = mem
        self.root = rootdev
        self.ostype = os_type

    def script(self):
        if self.scriptname:
            return script(self.scriptname)
        else:
            return ""

    def mem(self):
        if self.memsize:
            return self.memsize
        else:
            return "128MB"

    def disks(self):
        if self.disknames:
            return [disk(diskname) for diskname in self.disknames]
        else:
            return []

    def rootdev(self):
        if self.root:
            return self.root
        else:
            return "/dev/sda1"

    def os_type(self):
        return self.ostype


# Benchmarks are defined as a key in a dict which is a list of SysConfigs
# The first defined machine is the test system, the others are driving systems

Benchmarks = {
    "PovrayBench": [SysConfig("povray-bench.rcS", "512MB", ["povray.img"])],
    "PovrayAutumn": [SysConfig("povray-autumn.rcS", "512MB", ["povray.img"])],
    "NetperfStream": [
        SysConfig("netperf-stream-client.rcS"),
        SysConfig("netperf-server.rcS"),
    ],
    "NetperfStreamUdp": [
        SysConfig("netperf-stream-udp-client.rcS"),
        SysConfig("netperf-server.rcS"),
    ],
    "NetperfUdpLocal": [SysConfig("netperf-stream-udp-local.rcS")],
    "NetperfStreamNT": [
        SysConfig("netperf-stream-nt-client.rcS"),
        SysConfig("netperf-server.rcS"),
    ],
    "NetperfMaerts": [
        SysConfig("netperf-maerts-client.rcS"),
        SysConfig("netperf-server.rcS"),
    ],
    "SurgeStandard": [
        SysConfig("surge-server.rcS", "512MB"),
        SysConfig("surge-client.rcS", "256MB"),
    ],
    "SurgeSpecweb": [
        SysConfig("spec-surge-server.rcS", "512MB"),
        SysConfig("spec-surge-client.rcS", "256MB"),
    ],
    "Nhfsstone": [
        SysConfig("nfs-server-nhfsstone.rcS", "512MB"),
        SysConfig("nfs-client-nhfsstone.rcS"),
    ],
    "Nfs": [
        SysConfig("nfs-server.rcS", "900MB"),
        SysConfig("nfs-client-dbench.rcS"),
    ],
    "NfsTcp": [
        SysConfig("nfs-server.rcS", "900MB"),
        SysConfig("nfs-client-tcp.rcS"),
    ],
    "IScsiInitiator": [
        SysConfig("iscsi-client.rcS", "512MB"),
        SysConfig("iscsi-server.rcS", "512MB"),
    ],
    "IScsiTarget": [
        SysConfig("iscsi-server.rcS", "512MB"),
        SysConfig("iscsi-client.rcS", "512MB"),
    ],
    "Validation": [
        SysConfig("iscsi-server.rcS", "512MB"),
        SysConfig("iscsi-client.rcS", "512MB"),
    ],
    "Ping": [SysConfig("ping-server.rcS"), SysConfig("ping-client.rcS")],
    "ValAccDelay": [SysConfig("devtime.rcS", "512MB")],
    "ValAccDelay2": [SysConfig("devtimewmr.rcS", "512MB")],
    "ValMemLat": [SysConfig("micro_memlat.rcS", "512MB")],
    "ValMemLat2MB": [SysConfig("micro_memlat2mb.rcS", "512MB")],
    "ValMemLat8MB": [SysConfig("micro_memlat8mb.rcS", "512MB")],
    "ValMemLat": [SysConfig("micro_memlat8.rcS", "512MB")],
    "ValTlbLat": [SysConfig("micro_tlblat.rcS", "512MB")],
    "ValSysLat": [SysConfig("micro_syscall.rcS", "512MB")],
    "ValCtxLat": [SysConfig("micro_ctx.rcS", "512MB")],
    "ValStream": [SysConfig("micro_stream.rcS", "512MB")],
    "ValStreamScale": [SysConfig("micro_streamscale.rcS", "512MB")],
    "ValStreamCopy": [SysConfig("micro_streamcopy.rcS", "512MB")],
    "MutexTest": [SysConfig("mutex-test.rcS", "128MB")],
    "ArmAndroid-GB": [
        SysConfig(
            "null.rcS",
            "256MB",
            ["ARMv7a-Gingerbread-Android.SMP.mouse.nolock.clean.img"],
            None,
            "android-gingerbread",
        )
    ],
    "bbench-gb": [
        SysConfig(
            "bbench-gb.rcS",
            "256MB",
            ["ARMv7a-Gingerbread-Android.SMP.mouse.nolock.img"],
            None,
            "android-gingerbread",
        )
    ],
    "ArmAndroid-ICS": [
        SysConfig(
            "null.rcS",
            "256MB",
            ["ARMv7a-ICS-Android.SMP.nolock.clean.img"],
            None,
            "android-ics",
        )
    ],
    "bbench-ics": [
        SysConfig(
            "bbench-ics.rcS",
            "256MB",
            ["ARMv7a-ICS-Android.SMP.nolock.img"],
            None,
            "android-ics",
        )
    ],
}

benchs = list(Benchmarks.keys())
benchs.sort()
DefinedBenchmarks = ", ".join(benchs)
